package com.itheima.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.itheima.reggie.common.BaseContext;
import com.itheima.reggie.common.R;
import com.itheima.reggie.entity.ShoppingCart;
import com.itheima.reggie.service.ShoppingCartService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 购物车
 */
@Slf4j
@RestController
@RequestMapping("/shoppingCart")
public class ShoppingCartController {
    @Autowired
    private ShoppingCartService shoppingCartService;

    //增
    @PostMapping("add")
    public R add(@RequestBody ShoppingCart shoppingCart) {
        log.info("购物车加入了{}", shoppingCart);
        // 购物车数据是关联用户的，在表结构中，我们需要记录，每一个用户的购物车数据是哪些
        // 获取当前登录用户，为购物车对象赋值
        Long userId = BaseContext.getCurrentId();
        shoppingCart.setUserId(userId);

        //菜品列表展示出来的既有套餐，又有菜品，如果APP端选择的是套餐，就保存套餐ID(setmeal_id)，如果APP端选择的是菜品，就保存菜品ID(dish_id)
        // 所以sql语句或者说lqw语句要判断传入的参数中哪些有就添加,哪些没有就为null
        LambdaQueryWrapper<ShoppingCart> lqw = new LambdaQueryWrapper<>();
        lqw.eq(ShoppingCart::getUserId, userId);
        lqw.eq(shoppingCart.getDishId() != null, ShoppingCart::getDishId, shoppingCart.getDishId());
        lqw.eq(shoppingCart.getSetmealId() != null, ShoppingCart::getSetmealId, shoppingCart.getSetmealId());

        //对同一个菜品/套餐，如果选择多份不需要添加多条记录，增加数量number即可
        // 所以要根据当前登录用户ID 及 本次添加的菜品ID/套餐ID，查询购物车数据是否存在
        ShoppingCart cartServiceOne = shoppingCartService.getOne(lqw);
        // 存在就setNum+1,不存在就正常添加setNum=1
        if (cartServiceOne == null) {
            shoppingCart.setNumber(1);
            shoppingCart.setCreateTime(LocalDateTime.now());
            cartServiceOne = shoppingCart;
            shoppingCartService.save(cartServiceOne);
        } else {
            cartServiceOne.setNumber(cartServiceOne.getNumber() + 1);
            shoppingCartService.updateById(cartServiceOne);
        }

        return R.success(cartServiceOne);
    }

    //删 删用户指定的
    @PostMapping("sub")
    public R sub(@RequestBody ShoppingCart shoppingCart) {
        log.info("购物车删除了{}", shoppingCart);
        // 先获取当前用户的购物车全数据
        Long userId = BaseContext.getCurrentId();
        LambdaQueryWrapper<ShoppingCart> lqw = new LambdaQueryWrapper<>();
        lqw.eq(ShoppingCart::getUserId, userId);
        // 再根据菜品id或者套餐id从整个购物车中找到对应的内容
        Long setmealId = shoppingCart.getSetmealId();
        Long dishId = shoppingCart.getDishId();
        lqw.eq(setmealId != null, ShoppingCart::getSetmealId, setmealId);
        lqw.eq(dishId != null, ShoppingCart::getDishId, dishId);
        ShoppingCart cart = shoppingCartService.getOne(lqw);
        if (cart.getNumber() > 1) {
            // 判断要删除的内容数量是否大于1,如果大于1,把数量-1就行
            cart.setNumber(cart.getNumber() - 1);
            shoppingCartService.updateById(cart);
            return R.success(cart);
        } else if (cart.getNumber() == 1) {
            //  如果是等于1,就直接把整个内容删掉
            shoppingCartService.removeById(cart.getId());
            LambdaQueryWrapper<ShoppingCart> splqw = new LambdaQueryWrapper<>();
            splqw.eq(ShoppingCart::getUserId, userId);
            List<ShoppingCart> list = shoppingCartService.list(splqw);
            return R.success(list);
        }
        return R.success(shoppingCartService.list(lqw));

    }

    // 删 清空 在ShoppingCartController中创建clean方法，在方法中获取当前登录用户，根据登录用户ID，删除购物车数据。
    @DeleteMapping("clean")
    public R clean() {
        log.info("清空购物车");
        //在方法中获取当前登录用户，根据登录用户ID，删除购物车数据。
        LambdaQueryWrapper<ShoppingCart> lqw = new LambdaQueryWrapper<>();
        lqw.eq(ShoppingCart::getUserId, BaseContext.getCurrentId());
        shoppingCartService.remove(lqw);
        return R.success("已清空");
    }


    // 改

    // 查  在ShoppingCartController中创建list方法，根据当前登录用户ID查询购物车列表，并对查询的结果进行创建时间的倒序排序。
    @GetMapping("list")
    public R list() {
        log.info("查看购物车...");
        // 根据当前登录用户ID查询购物车列表，并对查询的结果进行创建时间的倒序排序。
        Long currentId = BaseContext.getCurrentId();
        LambdaQueryWrapper<ShoppingCart> lqw = new LambdaQueryWrapper<>();
        lqw.eq(ShoppingCart::getUserId, currentId);
        lqw.orderByDesc(ShoppingCart::getCreateTime);
        List<ShoppingCart> list = shoppingCartService.list(lqw);
        return R.success(list);

    }
}